# 迭代器

# range() 返回一个可以迭代的对象
# range(10, 2, -1) # 10 - 3

"""
iter()
    功能：把可迭代对象转换为一个迭代器对象
    参数：可迭代的对象 （str, list, tuple, dict, set, range......)
    返回值：迭代器对象

    注意：迭代器一定是一个可以迭代的对象，但是可迭代对象不一定是迭代器
"""

# 迭代器取值方案
'''
1, next() 调用依次获取一次，直到数据被取完
2, list() 使用list取出迭代器中的所有数据
3, for 使用for循环遍历迭代器的数据
迭代器取值特点，取出一个少一个，直到都取完，再次获取就会报错
'''


# 定义一个列表，是一个可迭代的对象
f4 = [1, 2, 3, 4]
# 可以使用for循环来遍历数据
res = iter(f4)
# print(res, type(res)) # [1, 2, 3, 4]

# 使用next()函数去调用迭代器对象
# r = next(res)
# print(r)
# r = next(res)
# print(r)
# print(next(res))
# print(next(res))
# # print(next(res)) # 报错，超出可迭代的范围
# r = list(res)
# print(r) # []


# 使用list获取全部数据
# r = list(res)
# print(r)

# 使用for循环
# for i in res:
#     print(i)


# 检测迭代器和可迭代对象的方法
# 导包
from collections.abc import Iterable, Iterator

myList = [1, 3, 5, 7, 9]
res = iter(myList)
# type() 函数返回当前数据的类型
# isinstance() 检测一个数据是不是一个指定的类型
print(isinstance(res, Iterable)) # True 是一个可迭代对象
print(isinstance(res, Iterator)) # True 是一个迭代器
print(isinstance(myList, Iterable)) # True 是一个可迭代对象
print(isinstance(myList, Iterator)) # False 不是一个迭代器
# 结论：一个迭代器一定是一个可迭代对象，但是一个可迭代对象不一定是一个迭代器
# 只有迭代器能够使用next()函数




